package echoserver

import (
	"io"
	"log"
	"net"
	"strconv"
	"time"
)

func RunPrefix() {
	// 监听本地 8000 端口的 TCP 连接
	listener, err := net.Listen("tcp", "localhost:8001")
	if err != nil {
		log.Fatal(err)
	}
	log.Println("Server is listening on port 8001, it will echo content with prefix [echo]")

	// 循环接受客户端连接
	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Print(err)
			continue
		}
		// 为每个客户端连接启动一个 goroutine 处理
		go handleConnWithPrefix(conn)
	}
}

// 处理客户端连接
// 处理客户端连接
func handleConnWithPrefix(c net.Conn) {
	// 确保连接在函数结束时关闭
	defer c.Close()

	// 创建一个缓冲区来存储从客户端读取的数据
	buffer := make([]byte, 1024)
	for {
		// 从客户端读取数据
		n, err := c.Read(buffer)
		if err != nil {
			if err != io.EOF {
				log.Printf("Error reading from client: %v", err)
			}
			break
		}

		// 截取实际读取的数据部分
		data := buffer[:n]

		// 将处理后的数据写回客户端
		// 增加循环输出的逻辑，测试当客户端关闭了主动写后，我们的输出依然可以稳定的被接收方接受到
		// 每隔1s输出一次，最多输出10次
		for i := 0; i < 10; i++ {
			// 为响应数据添加 [echo] 前缀
			prefix := []byte("[echo]")
			countStr := []byte("[Count:" + strconv.Itoa(i) + "]")
			prefixedData := append(append(prefix, countStr...), data...)
			_, err = c.Write(prefixedData)
			if err != nil {
				log.Printf("Error writing to client: %v", err)
				break
			}

			// 每隔1s输出一次
			log.Println(string(prefixedData))
			time.Sleep(time.Second * 1)
		}
	}
}
